﻿using JoseDiego_Data_Mudanca_Requisito_02;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Collections.Generic;
using MockUtil;

namespace JoseDiego_Data_Test
{
	/// <summary>
	///This is a test class for DateUtilTest and is intended
	///to contain all DateUtilTest Unit Tests
	///</summary>
	[TestClass()]
	public class DateUtilTest
	{
		#region Configurações
		private TestContext testContextInstance;

		/// <summary>
		///Gets or sets the test context which provides
		///information about and functionality for the current test run.
		///</summary>
		public TestContext TestContext
		{
			get
			{
				return testContextInstance;
			}
			set
			{
				testContextInstance = value;
			}
		}

		#endregion

		/// <summary>
		///A test for ReturnDaysUtils
		///</summary>
		[TestMethod()]
		public void Deve_Retornar_Lista_Com_Os_5_Ultimos_Dias_Uteis_Quando_Data_Inicial_For_27_02_2012()
		{
			DateUtil target = new DateUtil();
			DateTime dateSpecific = new DateTime( 2012, 02, 27 );
			int amountDays = 5;
			List<DateTime> expected = MockData.RetornarListaCom5UltimosDiasUteisParaData_27_02_2012();
			List<DateTime> actual = target.ReturnDaysUtils( dateSpecific, amountDays );

			Assert.AreEqual( expected[ 0 ], actual[ 0 ] );
			Assert.AreEqual( expected[ 1 ], actual[ 1 ] );
			Assert.AreEqual( expected[ 2 ], actual[ 2 ] );
			Assert.AreEqual( expected[ 3 ], actual[ 3 ] );
			Assert.AreEqual( expected[ 4 ], actual[ 4 ] );
		}

		[TestMethod()]
		public void Deve_Retornar_Lista_Com_Os_5_Ultimos_Dias_Uteis_Quando_Data_Inicial_For_07_03_2012()
		{
			DateUtil target = new DateUtil();
			DateTime dateSpecific = new DateTime( 2012, 03, 07 );
			int amountDays = 5;
			List<DateTime> expected = MockData.RetornarListaCom5UltimosDiasUteisParaData_07_03_2012();
			List<DateTime> actual = target.ReturnDaysUtils( dateSpecific, amountDays );

			Assert.AreEqual( expected[ 0 ], actual[ 0 ] );
			Assert.AreEqual( expected[ 1 ], actual[ 1 ] );
			Assert.AreEqual( expected[ 2 ], actual[ 2 ] );
			Assert.AreEqual( expected[ 3 ], actual[ 3 ] );
			Assert.AreEqual( expected[ 4 ], actual[ 4 ] );
		}

		// 1) Retornar os últimos 7 Dias úteis
		[TestMethod()]
		public void Deve_Retornar_Lista_Com_Os_7_Ultimos_Dias_Uteis_Quando_Data_Inicial_For_27_02_2012()
		{
			DateUtil target = new DateUtil();
			DateTime dateSpecific = new DateTime( 2012, 02, 27 );
			int amountDays = 7;
			List<DateTime> expected = MockData.RetornarListaCom7UltimosDiasUteisParaData_27_02_2012();
			List<DateTime> actual = target.ReturnDaysUtils( dateSpecific, amountDays );

			Assert.AreEqual( expected[ 0 ], actual[ 0 ] );
			Assert.AreEqual( expected[ 1 ], actual[ 1 ] );
			Assert.AreEqual( expected[ 2 ], actual[ 2 ] );
			Assert.AreEqual( expected[ 3 ], actual[ 3 ] );
			Assert.AreEqual( expected[ 4 ], actual[ 4 ] );
			Assert.AreEqual( expected[ 5 ], actual[ 5 ] );
			Assert.AreEqual( expected[ 6 ], actual[ 6 ] );
		}

		// 2) Retornar o último dia útil 
		[TestMethod()]
		public void Deve_Retornar_O_Ultimo_Dia_Util_Quando_Data_Inicial_For_27_02_2012()
		{
			DateUtil target = new DateUtil();
			DateTime dateSpecific = new DateTime( 2012, 02, 27 );
			int amountDays = 1;
			DateTime expected = MockData.RetornarUltimoDiaUltilParaData_27_02_2012();
			List<DateTime> actual = target.ReturnDaysUtils( dateSpecific, amountDays );
			Assert.AreEqual( expected, actual[ 0 ] );
		}

		// 3) Retornar os últimos 5 dias corridos
		[TestMethod()]
		public void Deve_Retornar_Os_Ultimos_5_Dias_Corridos_Quando_Data_Inicial_For_27_02_2012()
		{
			DateUtil target = new DateUtil();
			DateTime dateSpecific = new DateTime( 2012, 02, 27 );
			int amountDays = 5;
			List<DateTime> expected = MockData.RetornarListaCom5UltimosDiasCorridosParaData_27_02_2012();
			List<DateTime> actual = target.ReturnDaysCalendar( dateSpecific, amountDays );
			Assert.AreEqual( expected[ 0 ], actual[ 0 ] );
			Assert.AreEqual( expected[ 1 ], actual[ 1 ] );
			Assert.AreEqual( expected[ 2 ], actual[ 2 ] );
			Assert.AreEqual( expected[ 3 ], actual[ 3 ] );
			Assert.AreEqual( expected[ 4 ], actual[ 4 ] );
		}

		// 4) Retornar os últimos 7 dias corridos
		[TestMethod()]
		public void Deve_Retornar_Os_Ultimos_7_Dias_Corridos_Quando_Data_Inicial_For_27_02_2012()
		{
			DateUtil target = new DateUtil();
			DateTime dateSpecific = new DateTime( 2012, 02, 27 );
			int amountDays = 7;
			List<DateTime> expected = MockData.RetornarListaCom7UltimosDiasCorridosParaData_27_02_2012();
			List<DateTime> actual = target.ReturnDaysCalendar( dateSpecific, amountDays );
			Assert.AreEqual( expected[ 0 ], actual[ 0 ] );
			Assert.AreEqual( expected[ 1 ], actual[ 1 ] );
			Assert.AreEqual( expected[ 2 ], actual[ 2 ] );
			Assert.AreEqual( expected[ 3 ], actual[ 3 ] );
			Assert.AreEqual( expected[ 4 ], actual[ 4 ] );
			Assert.AreEqual( expected[ 5 ], actual[ 5 ] );
			Assert.AreEqual( expected[ 6 ], actual[ 6 ] );
		}

		// 5) Retornar os últimos 30 dias corridos 
		[TestMethod()]
		public void Deve_Retornar_Os_Ultimos_30_Dias_Corridos_Quando_Data_Inicial_For_27_02_2012()
		{
			DateUtil target = new DateUtil();
			DateTime dateSpecific = new DateTime( 2012, 02, 27 );
			int amountDays = 30;
			List<DateTime> expected = MockData.RetornarListaCom30UltimosDiasCorridosParaData_27_02_2012();
			List<DateTime> actual = target.ReturnDaysCalendar( dateSpecific, amountDays );
			Assert.AreEqual( expected[ 0 ], actual[ 0 ] );
			Assert.AreEqual( expected[ 1 ], actual[ 1 ] );
			Assert.AreEqual( expected[ 2 ], actual[ 2 ] );
			Assert.AreEqual( expected[ 3 ], actual[ 3 ] );
			Assert.AreEqual( expected[ 4 ], actual[ 4 ] );
			Assert.AreEqual( expected[ 5 ], actual[ 5 ] );
			Assert.AreEqual( expected[ 6 ], actual[ 6 ] );
			Assert.AreEqual( expected[ 7 ], actual[ 7 ] );
			Assert.AreEqual( expected[ 8 ], actual[ 8 ] );
			Assert.AreEqual( expected[ 9 ], actual[ 9 ] );
			Assert.AreEqual( expected[ 10 ], actual[ 10 ] );
			Assert.AreEqual( expected[ 11 ], actual[ 11 ] );
			Assert.AreEqual( expected[ 12 ], actual[ 12 ] );
			Assert.AreEqual( expected[ 13 ], actual[ 13 ] );
			Assert.AreEqual( expected[ 14 ], actual[ 14 ] );
			Assert.AreEqual( expected[ 15 ], actual[ 15 ] );
			Assert.AreEqual( expected[ 16 ], actual[ 16 ] );
			Assert.AreEqual( expected[ 17 ], actual[ 17 ] );
			Assert.AreEqual( expected[ 18 ], actual[ 18 ] );
			Assert.AreEqual( expected[ 19 ], actual[ 19 ] );
			Assert.AreEqual( expected[ 20 ], actual[ 20 ] );
			Assert.AreEqual( expected[ 21 ], actual[ 21 ] );
			Assert.AreEqual( expected[ 22 ], actual[ 22 ] );
			Assert.AreEqual( expected[ 23 ], actual[ 23 ] );
			Assert.AreEqual( expected[ 24 ], actual[ 24 ] );
			Assert.AreEqual( expected[ 25 ], actual[ 25 ] );
			Assert.AreEqual( expected[ 26 ], actual[ 26 ] );
			Assert.AreEqual( expected[ 27 ], actual[ 27 ] );
			Assert.AreEqual( expected[ 28 ], actual[ 28 ] );
			Assert.AreEqual( expected[ 29 ], actual[ 29 ] );
		}

		// 7) Verificar se uma Data é Dia Útil
		[TestMethod()]
		public void Deve_Retornar_TRUE_Quando_A_Data_Passada_For_Dia_Util_Data_Inicial_27_02_2012()
		{
			DateUtil target = new DateUtil();
			DateTime dataInicial = new DateTime( 2012, 02, 27 );
			bool expected = true;
			bool actual = target.CheckDayUtil( dataInicial );
			Assert.AreEqual( expected, actual );
		}

		// 8) Verificar se uma Data é Feriado
		[TestMethod()]
		public void Deve_Retornar_FALSE_Quando_A_Data_Passada_Nao_For_Feriado_Data_Inicial_27_02_2012()
		{
			DateUtil target = new DateUtil();
			DateTime dataInicial = new DateTime( 2012, 02, 27 );
			bool expected = false;
			bool actual = target.CheckHoliday( dataInicial );
			Assert.AreEqual( expected, actual );
		}

		/*
			6) Validar a Data que está sendo passada lançando uma exception com a mensagem apropriada. Para o nosso exemplo uma data é válida se estiver dentro do ano 2012:
		 
			a) Retornar os últimos 7 Dias úteis
				   Exception: throw new Exception("A data informada não é válida, por isso não foi possível retornar os últimos 7 dias úteis.")
		 */
		[TestMethod()]
		public void Deve_Lancar_Exception_Ao_Retornar_Os_Ultimos_7_Dias_Uteis()
		{
			try
			{
				DateUtil target = new DateUtil();
				DateTime dataInicial = new DateTime( 2010, 02, 27 );
				int amountDays = 7;
				target.ReturnDaysUtils( dataInicial, amountDays );
				Assert.Fail();
			}
			catch( Exception ex )
			{
				Assert.IsTrue( ex.Message.Equals( "A data informada não é válida, por isso não foi possível retornar os últimos 7 dias úteis." ) );
			}
		}

		/*
		    b) Retornar o último dia útil 
				 Exception: throw new Exception("Data inválida.")
		 */
		[TestMethod()]
		public void Deve_Lancar_Exception_Ao_Retornar_Ultimo_Dia_Util()
		{
			try
			{
				DateUtil target = new DateUtil();
				DateTime dataInicial = new DateTime( 2010, 02, 27 );
				int amountDays = 1;
				target.ReturnDaysUtils( dataInicial, amountDays );
				Assert.Fail();
			}
			catch( Exception ex )
			{
				Assert.IsTrue( ex.Message.Equals( "Data inválida." ) );
			}
		}

		/*
			c) Retornar os últimos 5 dias corridos 
			Exception: throw new Exception("Não foi possivel os últimos 5 dias corridos, favor informar uma data válida")
		*/
		[TestMethod()]
		public void Deve_Lancar_Exception_Ao_Retornar_Ultimos_5_Dias_Corridos()
		{
			try
			{
				DateUtil target = new DateUtil();
				DateTime dataInicial = new DateTime( 2010, 02, 27 );
				int amountDays = 5;
				target.ReturnDaysCalendar( dataInicial, amountDays );
				Assert.Fail();
			}
			catch( Exception ex )
			{
				Assert.IsTrue( ex.Message.Equals( "Não foi possivel os últimos 5 dias corridos, favor informar uma data válida" ) );
			}
		}

		/*
			d) Retornar os últimos 7 dias corridos	
			Exception: throw new Exception("Favor informar uma data válida")
		*/
		[TestMethod()]
		public void Deve_Lancar_Exception_Ao_Retornar_Ultimos_7_Dias_Corridos()
		{
			try
			{
				DateUtil target = new DateUtil();
				DateTime dataInicial = new DateTime( 2010, 02, 27 );
				int amountDays = 7;
				target.ReturnDaysCalendar( dataInicial, amountDays );
				Assert.Fail();
			}
			catch( Exception ex )
			{
				Assert.IsTrue( ex.Message.Equals( "Favor informar uma data válida" ) );
			}
		}

		/*
			e) Retornar os últimos 30 dias corridos
			Exception: throw new Exception("Impossível recuperar os últimos 30 dias a partir de uma data inválida.")
		 */
		[TestMethod()]
		public void Deve_Lancar_Exception_Ao_Retornar_Ultimos_30_Dias_Corridos()
		{
			try
			{
				DateUtil target = new DateUtil();
				DateTime dataInicial = new DateTime( 2010, 02, 27 );
				int amountDays = 30;
				target.ReturnDaysCalendar( dataInicial, amountDays );
				Assert.Fail();
			}
			catch( Exception ex )
			{
				Assert.IsTrue( ex.Message.Equals( "Impossível recuperar os últimos 30 dias a partir de uma data inválida." ) );
			}
		}
	}
}
